@objc func setupDomainAccount(
user: String, userId: String, serverUrl: String, password: String
) {
+ let account = Account(user: user, id: userId, serverUrl: serverUrl, password: password)
+ guard account != ncAccount else { return }
+
Task {
- let authTestNcKit = NextcloudKit()
- authTestNcKit.setup(user: user, userId: userId, password: password, urlBase: serverUrl)
+ ncKit.appendSession(
+ account: account.ncKitAccount,
+ urlBase: serverUrl,
+ user: user,
+ userId: userId,
+ password: password,
+ userAgent: "Nextcloud-macOS/FileProviderExt",
+ nextcloudVersion: 25,
+ groupIdentifier: ""
+ )
var authAttemptState = AuthenticationAttemptResultState.connectionError // default
// Retry a few times if we have a connection issue
for authTimeout in AuthenticationTimeouts {
- authAttemptState = await authTestNcKit.tryAuthenticationAttempt()
+ authAttemptState = await ncKit.tryAuthenticationAttempt(account: account)
guard authAttemptState == .connectionError else { break }
Logger.fileProviderExtension.info(
}
Task { @MainActor in
- let newNcAccount =
- Account(user: user, id: userId, serverUrl: serverUrl, password: password)
- guard newNcAccount != ncAccount else { return }
- ncAccount = newNcAccount
- ncKit.setup(
- account: newNcAccount.ncKitAccount,
- user: newNcAccount.username,
- userId: newNcAccount.id,
- password: newNcAccount.password,
- urlBase: newNcAccount.serverUrl,
- userAgent: "Nextcloud-macOS/FileProviderExt",
- nextcloudVersion: 25,
- delegate: nil) // TODO: add delegate methods for self
-
+ ncAccount = account
changeObserver = RemoteChangeObserver(
- remoteInterface: ncKit, changeNotificationInterface: self, domain: domain
+ account: account,
+ remoteInterface: ncKit,
+ changeNotificationInterface: self,
+ domain: domain
)
ncKit.setup(delegate: changeObserver)
signalEnumeratorAfterAccountSetup()
@objc class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension {
let domain: NSFileProviderDomain
- let ncKit = NextcloudKit()
+ let ncKit = NextcloudKit.shared
let appGroupIdentifier = Bundle.main.object(forInfoDictionaryKey: "SocketApiPrefix") as? String
var ncAccount: Account?
var changeObserver: RemoteChangeObserver?
request _: NSFileProviderRequest,
completionHandler: @escaping (NSFileProviderItem?, Error?) -> Void
) -> Progress {
- if ncAccount == nil {
+ guard let ncAccount else {
Logger.fileProviderExtension.error(
"""
Not fetching item for identifier: \(identifier.rawValue, privacy: .public)
"""
)
completionHandler(nil, NSFileProviderError(.notAuthenticated))
- } else if let item = Item.storedItem(identifier: identifier, remoteInterface: ncKit) {
+ return Progress()
+ }
+
+ if let item = Item.storedItem(
+ identifier: identifier, account: ncAccount, remoteInterface: ncKit
+ ) {
completionHandler(item, nil)
} else {
completionHandler(nil, NSFileProviderError(.noSuchItem))
return Progress()
}
- guard ncAccount != nil else {
+ guard let ncAccount else {
Logger.fileProviderExtension.error(
"""
Not fetching contents for item: \(itemIdentifier.rawValue, privacy: .public)
return Progress()
}
- guard let item = Item.storedItem(identifier: itemIdentifier, remoteInterface: ncKit) else {
+ guard let item = Item.storedItem(
+ identifier: itemIdentifier, account: ncAccount, remoteInterface: ncKit
+ ) else {
Logger.fileProviderExtension.error(
"""
Not fetching contents for item: \(itemIdentifier.rawValue, privacy: .public)
contents: url,
request: request,
domain: self.domain,
+ account: ncAccount,
remoteInterface: ncKit,
progress: progress
)
return Progress()
}
- guard let existingItem = Item.storedItem(identifier: identifier, remoteInterface: ncKit) else {
+ guard let existingItem = Item.storedItem(
+ identifier: identifier, account: ncAccount, remoteInterface: ncKit
+ ) else {
Logger.fileProviderExtension.error(
"Not modifying item: \(ocId, privacy: .public) as item not found."
)
"Received delete request for item: \(identifier.rawValue, privacy: .public)"
)
- guard ncAccount != nil else {
+ guard let ncAccount else {
Logger.fileProviderExtension.error(
"Not deleting item \(identifier.rawValue, privacy: .public), account not set up yet"
)
return Progress()
}
- guard let item = Item.storedItem(identifier: identifier, remoteInterface: ncKit) else {
+ guard let item = Item.storedItem(
+ identifier: identifier, account: ncAccount, remoteInterface: ncKit
+ ) else {
Logger.fileProviderExtension.error(
"Not deleting item \(identifier.rawValue, privacy: .public), item not found"
)
return Enumerator(
enumeratedItemIdentifier: containerItemIdentifier,
+ account: ncAccount,
remoteInterface: ncKit,
domain: domain,
fastEnumeration: config.fastEnumerationEnabled,